package com.lyc.platform.server.gateway.bean.message;

import com.lyc.platform.server.gateway.consts.Consts;

/**
 * @author liangyucheng
 * 消息抽象接口
 */
public interface Message {

    /**
     * 消息认证失败,无法通过网关
     *
     * @return 认证失败
     */
    static Message authError() {
        return new SimpleMessage(null, null, null, Type.authError, Consts.authError);
    }

    /**
     * 消息错误
     *
     * @param id      消息的唯一id
     * @param topic
     * @param message
     * @return
     */
    static Message error(String id, String topic, String message) {

        return new SimpleMessage(id, topic, null, Type.error, message);
    }

    static Message error(String id, String topic, Throwable message) {
        return new SimpleMessage(id, topic, null, Type.error, message.getMessage() == null ? message.getClass().getSimpleName() : message.getMessage());
    }

    static Message success(String id, String topic, Object payload) {
        return new SimpleMessage(id, topic, payload, Type.result, null);
    }

    static Message complete(String id) {
        return new SimpleMessage(id, null, null, Type.complete, null);
    }

    static Message pong(String id) {
        return new SimpleMessage(id, null, null, Type.pong, null);
    }

    /**
     * 获得请求的id
     *
     * @return 请求id
     */
    String getRequestId();

    /**
     * 获得订阅的topic
     *
     * @return 消息所属于的topic
     */
    String getTopic();

    /**
     * 获得有效载荷
     *
     * @return 有效载荷
     */
    Object getPayload();

    /**
     * 获得这个消息
     *
     * @return 消息的主体
     */
    String getMessage();

    /**
     * 返回消息的状态
     *
     * @return 消息目前的状态
     */
    Type getType();

    enum Type {
        authError,
        result,
        error,
        complete,
        ping,
        pong
    }
}
